package com.itheima.case2.utils;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;

public class BeansFactory {
    /*
        TODO:
            1.在java中创建对象有两种：
                1）单例设计模式  只有一个对象 ******
                2）多例设计模式  多个对象
           2.保存对象的集合：保证单例
            Map<String,                 Object>
                键                       值
                指定的内容userService    创建的对象
           每次调用工厂中的静态方法产生对象，都要判断map集合中是否有该对象，如果有该对象则取出并返回，如果没有对象
           那么使用反射创建对象，然后将创建的对象放到map集合中并返回创建的对象
             userService   UserServiceImpl@5533
             roleService   RoleServcieImpl@5534
     */
    //1.创建集合保存对象
    private static Map<String,Object> map = new HashMap<>();
    //2.定义静态方法生产对象
    //单例设计模式：懒汉式，多线程安全问题 t1  t2
    public static synchronized  <T> T getInstance(String classNameKey) throws Exception{//classNameKey = userService  roleService ....
        //3.根据传递的key获取map集合的值
        Object objValue = map.get(classNameKey);
        //4.判断
        if(objValue == null){
            //5.说明之前map集合中没有该对象，使用反射创建对象
            //6.读取配置文件
            ResourceBundle bundle = ResourceBundle.getBundle("bean");//只需要书写配置文件名即可
            String keyStr = bundle.getString(classNameKey);//t1 t2
            //7.使用反射
//            Class<?> clazz = Class.forName("com.itheima.case2.service.impl.UserServcieImpl");
            Class<?> clazz = Class.forName(keyStr);
            //8.创建对象
            objValue = clazz.newInstance();
            //9.放到map中
            map.put(classNameKey,objValue);//t1 0x001  t2  0x002
        }

        //10.将创建的对象返回给调用者
        return (T)objValue;

    }
}

